import axios from 'axios'
import { showToast } from 'vant'
import { useUserStore } from '@/stores/user'
import router from '@/router'
const request = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL,
  timeout: 10000,

})

const addTimestamp = (config) => {
  // GET请求添加时间戳到params
  if (config.method === 'get') {
    config.params = {
      ...config.params
    }
  }
  // POST请求且不是form-urlencoded时添加时间戳到data
  else if (['post', 'put', 'patch'].includes(config.method) && 
    config.headers['Content-Type'] !== 'application/x-www-form-urlencoded') {
    // config.data = {
    //   ...config.data,
    //   t: Date.now()
    // }
  }
  return config;
}

const addAuthorizationHeader = (config) => {
  const userStore = useUserStore();
  // 如果是登录接口，单独设置请求头
  if (config.url.indexOf('/auth/oauth/token') !== -1 || config.url.indexOf('/auth/authentication/openid')!== -1) {
    config.headers['Authorization'] = 'Basic d2VjaGF0LXJlcG9ydDp3ZWNoYXQtcmVwb3J0';
    return config; 
  }
  // if(config.url.indexOf('/auth/oauth/token') !== -1 || config.url.indexOf('/auth/authentication/openid') !== -1){
  //   config.headers['Authorization'] = 'Basic d2VjaGF0LXJlcG9ydDp3ZWNoYXQtcmVwb3J0';

  if (userStore.token) {
    config.headers.Authorization = `Bearer ${userStore.token}`;
  }
  return config;
};
// 处理请求头
const handleContentType = (config) => {
  // 优先处理 FormData
  if (config.data instanceof FormData) {
    config.headers['Content-Type'] = 'multipart/form-data'; // axios会自动处理boundary
    return config;
  }

  if (config.data instanceof URLSearchParams) {
    config.headers['Content-Type'] = 'application/x-www-form-urlencoded';
    return config;
  }

  // 默认JSON（保留原有逻辑）
  config.headers['Content-Type'] = 'application/json';
  return config;
};
const convertToFormData = (config) => {
  if (config.method === 'post' && config.data && !(config.data instanceof FormData)) {
    const formData = new FormData();
    Object.entries(config.data).forEach(([key, value]) => {
      formData.append(key, value);
    });
    config.data = formData;
  }
  return config;
};
// 请求拦截器
request.interceptors.request.use(
  (config) => {
    try {
      config = convertToFormData(config);
      config = handleContentType(config);  // 先处理Content-Type
      config = addAuthorizationHeader(config);
      config = addTimestamp(config);
      
      // 调试日志
      console.log('请求配置:', {
        url: config.url,
        method: config.method,
        headers: config.headers,
        data: config.data,
        rawData: typeof config.data === 'string' ? config.data : JSON.stringify(config.data)
      });
      
      return config;
    } catch (error) {
      console.error('请求拦截器出错:', error);
      return Promise.reject(error);
    }
  },
  (error) => {
    console.error('请求拦截器出错:', error);
    return Promise.reject(error);
  }
);

// 响应拦截器
request.interceptors.response.use(
  response => {
    const { data } = response;
    // 如果响应码为 0，表示请求成功，返回响应数据
    if (data.code === 0) {
      return data.data;
    }
    // 显示错误信息并抛出错误
    showToast(data.message || '请求失败');
    return Promise.reject(new Error(data.message || '请求失败'));
  },
  error => {
    // 记录详细的错误信息
    console.error('响应拦截器出错:', {
      status: error.response?.status,
      statusText: error.response?.statusText,
      data: error.response?.data,
      message: error.message
    });

    // 处理不同的 HTTP 状态码
    if (error.response) {
      switch (error.response.status) {
        case 401:
          // 用户未授权，清除令牌并跳转到登录页面
          const userStore = useUserStore();
          userStore.clearToken();
          router.push('/doctor/login');
          break;
        case 403:
          // 用户没有权限访问，显示相应的错误信息
          showToast('您没有权限访问此资源');
          break;
        case 404:
          // 请求的资源不存在，显示相应的错误信息
          showToast('请求的资源不存在');
          break;
        case 500:
          // 服务器内部错误，显示相应的错误信息
          showToast('服务器内部错误，请稍后再试');
          break;
        default:
          // 其他错误，显示默认的错误信息
          showToast(error.message || '网络错误');
      }
    } else {
      // 没有响应，可能是网络问题，显示网络错误信息
      showToast('网络错误，请检查网络连接');
    }

    // 抛出错误
    return Promise.reject(error);
  }
);

export default request;